package com.edu.internship.util;

import org.apache.commons.lang3.StringUtils;

/**
 * code is far away from bug with the animal protecting
 *
 * @author lishiquan
 * @description
 * @date 2020-01-03
 */
public class DesensitizedUtils {

    private DesensitizedUtils() {
    }

    /**
     * 【手机号码】显示前三位，后四位，其他隐藏，比如135****1234
     *
     * @param mobile 手机号
     * @return 脱敏手机号
     */
    public static String mobile(String mobile) {
        if (!ValidatorUtils.isMobile(mobile)) {
            return "";
        }
        return desValue(mobile, 3, 4, "*");
    }

    /**
     * 【身份证号】显示前六位和后四位，其他隐藏。共计18位，比如：123456*******01234
     *
     * @param idCard 18位身份证号
     * @return 脱敏身份证号
     */
    public static String idCard(String idCard) {
        if (StringUtils.isBlank(idCard)) {
            return "";
        }
        return desValue(idCard, 6, 4, "*");
    }

    /**
     * 【中文姓名】只显示首尾各1个汉字，其他隐藏为1个星号, 两个字的名字则只显示首尾
     *
     * @param name 中文名
     * @return 脱敏中文名
     */
    public static String chineseName(String name) {
        int nameLength = 2;
        if (StringUtils.isBlank(name)) {
            return "";
        }
        if (name.length() < nameLength) {
            return name;
        }
        if (name.length() == nameLength) {
            return name.charAt(0) + "*";
        }
        return desValue(name, 1, 1, "*");
    }

    /**
     * 【用户名/账号/appKey】只显示前四位,后两位,其余星号代替
     *
     * @param account 用户名/账号/appKey
     * @return 脱敏用户名/账号/appKey
     */
    public static String account(String account) {
        if (StringUtils.isBlank(account)) {
            return "";
        }
        return desValue(account, 2, 2, "*");
    }

    /**
     * 【密码/秘钥/appSecret】全星号替代
     *
     * @param password 密码/秘钥/appSecret
     * @return 脱敏密码/秘钥/appSecret
     */
    public static String password(String password) {
        if (StringUtils.isBlank(password)) {
            return "";
        }
        return desValue(password, 0, 0, "*");
    }

    /**
     * 【电子邮箱 邮箱前缀仅显示第一个字母，前缀其他隐藏，用星号代替，@及后面的地址显示，比如：d**@126.com>
     *
     * @param email 电子邮件
     * @return 脱敏电子邮件
     */
    public static String email(String email) {
        if (StringUtils.isBlank(email)) {
            return "";
        }
        int index = StringUtils.indexOf(email, "@");
        if (index <= 1) {
            return email;
        } else {
            String emailTmp = StringUtils.left(email, 1);
            return StringUtils.rightPad(emailTmp, index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));
        }
    }

    /**
     * 【银行卡号】显示前六后四，其他用星号隐藏每位1个星号，比如：622260**********1234>
     *
     * @param cardNum 银行卡卡号
     * @return 脱敏银行卡卡号
     */
    public static String bankCard(String cardNum) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return desValue(cardNum, 6, 4, "*");
    }

    /**
     * 【车牌号】前两位后一位，比如：苏M****5
     *
     * @param carNumber 车牌号
     * @return 脱敏车牌号
     */
    public static String carNumber(String carNumber) {
        if (StringUtils.isBlank(carNumber)) {
            return "";
        }
        return desValue(carNumber, 2, 1, "*");
    }

    /**
     * 对字符串进行脱敏操作
     *
     * @param origin          原始字符串
     * @param prefixNoMaskLen 左侧需要保留几位明文字段
     * @param suffixNoMaskLen 右侧需要保留几位明文字段
     * @param maskStr         用于遮罩的字符串, 如'*'
     * @return 脱敏后结果
     */
    public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) {
        if (origin == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0, n = origin.length(); i < n; i++) {
            if (i < prefixNoMaskLen) {
                sb.append(origin.charAt(i));
                continue;
            }
            if (i > (n - suffixNoMaskLen - 1)) {
                sb.append(origin.charAt(i));
                continue;
            }
            sb.append(maskStr);
        }
        return sb.toString();
    }

}
